
#coding:utf-8

#像这种内层函数引用了外层函数的变量（参数也算变量），
# 然后返回内层函数的情况，称为闭包（Closure）

#闭包的特点是返回的函数还引用了外层函数的局部变量
def calc_sum(lst):
    def lazy_sum():#lazy_sum 引用了calc_sum的参数lst
        return sum(lst)
    return lazy_sum


# 希望一次返回3个函数，分别计算1x1,2x2,3x3:
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
#f1,f2,f3返回的数据都是9，原因就是当count()函数返回了3个函数时，这3个函数所引用的变量 i 的值已经变成了3

print(f1())
print(f2())
print(f3())

#因此，返回函数不要引用任何循环变量，或者后续会发生变化的变量


def count():
    fs = []
    for i in range(1, 4):
        def f(i):
            def g():
                return i*i
            return g
        r=f(i)
        fs.append(r)
    return fs

f1, f2, f3 = count()
print (f1(), f2(), f3())